﻿//using System;
//using IocPerformance.Classes.Complex;
//using IocPerformance.Classes.Dummy;
//using IocPerformance.Classes.Generics;
//using IocPerformance.Classes.Multiple;
//using IocPerformance.Classes.Standard;
//using StructureMap;
//using StructureMap.Attributes;

//namespace IocPerformance.Adapters
//{
//    public sealed class StructureMapContainerAdapter : ContainerAdapterBase
//    {
//        private Container container;

//        public override string PackageName
//        {
//            get { return "structuremap"; }
//        }

//        public override bool SupportsInterception
//        {
//            get { return true; }
//        }

//        public override bool SupportGeneric
//        {
//            get { return true; }
//        }

//        public override bool SupportsMultiple
//        {
//            get { return true; }
//        }

//        public override object Resolve(Type type)
//        {
//            return this.container.GetInstance(type);
//        }

//        public override void Dispose()
//        {
//            // Allow the container and everything it references to be disposed.
//            this.container = null;
//        }

//        public override void Prepare()
//        {
//            //var pg = new Castle.DynamicProxy.ProxyGenerator();

//            this.container = new Container(r =>
//            {
//                RegisterDummies(r);
//                RegisterStandard(r);
//                RegisterComplex(r);
//                RegisterGeneric(r);
//                RegisterMultiple(r);
//                //RegisterInterceptor(r, pg);
//            });
//        }

//        private static void RegisterDummies(ConfigurationExpression r)
//        {
//            r.For<IDummyOne>().Request().Use<DummyOne>();
//            r.For<IDummyTwo>().Request().Use<DummyTwo>();
//            r.For<IDummyThree>().Request().Use<DummyThree>();
//            r.For<IDummyFour>().Request().Use<DummyFour>();
//            r.For<IDummyFive>().Request().Use<DummyFive>();
//            r.For<IDummySix>().Request().Use<DummySix>();
//            r.For<IDummySeven>().Request().Use<DummySeven>();
//            r.For<IDummyEight>().Request().Use<DummyEight>();
//            r.For<IDummyNine>().Request().Use<DummyNine>();
//            r.For<IDummyTen>().Request().Use<DummyTen>();
//        }

//        private static void RegisterStandard(ConfigurationExpression r)
//        {
//            r.For<ISingleton>().Container().Use<Container>();
//            r.For<ITransient>().Request().Use<Request>();
//            r.For<ICombined>().Request().Use<Combined>();
//        }

//        private static void RegisterComplex(ConfigurationExpression r)
//        {
//            r.For<IFirstService>().Container().Use<FirstService>();
//            r.For<ISecondService>().Container().Use<SecondService>();
//            r.For<IThirdService>().Container().Use<ThirdService>();
//            r.For<ISubObjectOne>().Request().Use<SubObjectOne>();
//            r.For<ISubObjectTwo>().Request().Use<SubObjectTwo>();
//            r.For<ISubObjectThree>().Request().Use<SubObjectThree>();
//            r.For<IComplex>().Request().Use<Complex>();
//        }

//        private static void RegisterGeneric(ConfigurationExpression r)
//        {
//            r.For(typeof(IGenericInterface<>)).LifecycleIs(InstanceScope.Transient).Use(typeof(GenericExport<>));
//            r.For(typeof(ImportGeneric<>)).Use(typeof(ImportGeneric<>));
//        }

//        private static void RegisterMultiple(ConfigurationExpression r)
//        {
//            r.For<ISimpleAdapter>().Request().Use<SimpleAdapterOne>();
//            r.For<ISimpleAdapter>().Request().Use<SimpleAdapterTwo>();
//            r.For<ISimpleAdapter>().Request().Use<SimpleAdapterThree>();
//            r.For<ISimpleAdapter>().Request().Use<SimpleAdapterFour>();
//            r.For<ISimpleAdapter>().Request().Use<SimpleAdapterFive>();
//            r.For<ImportMultiple>().Request().Use<ImportMultiple>();
//        }

//        private static void RegisterInterceptor(ConfigurationExpression r, ProxyGenerator pg)
//        {
//            r.For<ICalculator>().Request().Use<Calculator>()
//             .EnrichWith(c => pg.CreateInterfaceProxyWithTarget<ICalculator>(c, new StructureMapInterceptionLogger()));
//        }
//    }
//}